# 大小写转换
import re

s1 = 'Hello World '
# 小写
print(s1.lower())
# 判断字符是否都是小写
print(s1.islower())
# 大写
print(s1.upper())
# 是否都是大写
print(s1.isupper())

# 字符串分割
splitS1 = s1.split(' ')
print(splitS1[1])
# 字符串截取+使用切片
s1Section = s1[0:5]
print(s1Section)
# 获取某个字符的下标 , 但是这个不存在的情况会报错
print(s1.index('W'))
# find函数找下标不会报错 ， 会返回-1
print(s1.find('P'))
# 统计某个字符出现的次数
print(s1.count('o'))

# 判断前缀 和 后缀
print(s1.startswith('H'))
print(s1.startswith('h'))
print('demo.py'.endswith('.py'))
print('demo.text'.endswith('.text'))

# 替换其中的字符
s1 = s1.replace(' ', '巴嘎', 1)
print(s1)
# 拼接字符 '马迪迪'字符后面都加一个s1的字符
s1 = s1.join('马迪迪')
print(s1)
# 字符串在指定的宽度范围内居中
print(s1.center(66, '-'))
# 去掉字符串空格，去掉左右空格
s2 = '  Ma Di Di     '
print(s2.strip())
print(s2.strip().strip('Di'))
# 去掉左侧的
print(s2.lstrip())
# 去掉右侧的
print(s2.rstrip())
# 格式化字符串
print("-" * 10, '格式化字符串', '-' * 10)
# 占位符：%s 、字符串格式 %d十进制整数格式 %f浮点数格式
# f-string 格式化字符串方法
# str.format 方法模版字符串
name = '马迪迪'
age = 12
score = 77.23
print('姓名：%s、年龄：%d、成绩：%.1f' % (name, age, score))
# python3.6版本之后增加的方法
print(f'姓名：{name}、年龄：{age}、成绩：{score}')
# 字符串format方法
print('姓名：{0}、年龄：{1}、成绩：{2}'.format(name, age, score))
print("-" * 20, "format字符串格式控制", "-" * 20)
strVal = '马迪迪 Hello Word'
strWidth = 25
# 左对齐多出部分用*号填充
print('左对齐：{0:*<25}'.format(strVal))
print('右对齐：{0:*>25}'.format(strVal))
print('居中对齐 ：{0:*^25}'.format(strVal))
# 居住对齐
print('居中对齐：%s' % strVal.center(25, '*'))
# 字符串千位分割符
print('{0:,}'.format(9877895646))
print('{0:,}'.format(9877895646.12121))
# 精度控制
print('{0:.2f}'.format(9877895646.12121))
# 控制字符串最大显示长度
print('{0:.8s}'.format(strVal))

# 整数类型
numberStr = 666
print('二进制：{0:b}、十进制：{0:d}、八进制：{0:o}、十六进制：{0:x}、十六进制：{0:X}'.format(numberStr))
# 浮点类型
floatStr = 888.666
print('正常：{0:.2f}、科学计数法：{0:E} | {0:e}、百分号：{0:.2%}'.format(floatStr))

# 字符串的编码和解码 异常处理的方式 strict 严格的、ignore 忽略、replace 替换
print("-" * 10, '字符串编码和解码', '-' * 10)
name = '马迪迪'
score = name.encode('utf-8', 'replace')  # 默认是 utf-8，因为utf-8中文占3个字节
print(score)

score_gbk = name.encode('gbk', 'replace')  # gbk，因为gbk一个中文占2个字节
print(score_gbk)

# 编码中出错的问题
strErr = '老鼠%：你好！'
scode_replace = strErr.encode('gbk', 'replace')
print(scode_replace)
scode_strict = strErr.encode('gbk', 'strict')
print(scode_strict)

# 解码
scode_decode = scode_strict.decode('gbk', 'replace')
# 和编码的格式不一样会解不出来
scode_decode = scode_strict.decode('utf-8', 'replace')
print(scode_decode)

# ---------------------------------数据的验证
print('_' * 10, '数据的验证', '_' * 10)
# isdigit 只验证10进制的阿拉伯数字
print('验证是不是都是数字', '123'.isdigit())
print('验证汉子中文可以嘛', '一二三'.isdigit())
print('二进制', '01010b1'.isdigit())
# isnumeric 所有的字符都是数字
print('123'.isnumeric())
print('一二三'.isnumeric())
print('1c23'.isnumeric())  # 二进制不认识
print('一百'.isnumeric())
# 所有的字符都是字符（包含中文字符）
print('hello你好'.isalpha())
print('hello你好123'.isalpha())
print('hello你好二'.isalpha())
# 字符加数字
print('hello你好'.isalnum())
print('hello你好123'.isalnum())
print('hello你好二'.isalnum())
# 判断字符大小写
# 小写
print('helloworld'.islower())
print('HELLOWORLD'.islower())
print('hello小刘'.islower())
# 大写
print('helloworld'.isupper())
print('HELLOWORLD'.isupper())
print('hello小刘'.isupper())
# 判断首字符是不是大写
# 大写
print('Hello'.istitle())
print('HelloWorld'.istitle())
print('Helloworld'.istitle())
print('Hello World'.istitle())
print('Hello world'.istitle())

# 判断是不是空白字符
print(' '.isspace())
print('\t'.isspace())
print('\n '.isspace())

# ------------------------------------字符串拼接----------------
# 1. join 方法拼接
print('马'.join('迪').join('迪'))
print(' '.join(['马', '迪', '迪']))
print('*'.join(['马', '迪', '迪']))
# 2. + 直接拼接
print('马' + '迪' + '迪')
# 3. 直接拼接
print('马''迪''迪')
# 4. 字符串格式化拼接
print('字符串：%s，数字：%d' % ('马迪迪', 123))
print(f'{"马"}{"迪迪"}')
print('{0}{1}{2}'.format('马', '迪', '迪'))
# -----------------------------------字符串取重操作-----------------
strA = 'helloWorldhelloWorldhelloWorldhelloWorld'
# 1. 字符串拼接及 not in
new_strA = ''
for item in strA:
    if item not in new_strA:
        new_strA += item
print(new_strA)
# 2. 使用索引+not in
new_strB = ''
for index in range(len(strA)):
    if strA[index] not in new_strB:
        new_strB += strA[index]
print(new_strB)
# 3. 使用enumerate 函数
new_strC = ''
for index, item in enumerate(strA):
    if item not in new_strC:
        new_strC += strA[index]
print(new_strC)
# 4. 通过集合取重+列表排序
new_strD = set(strA)
lst = list(new_strD)
lst.sort(key=strA.index)
print(lst)

# --------------------------正则表达式 re模块--------------
print('*' * 20, '正则表达式_re模块', '*' * 20)
print('*' * 10, 're.match', '*' * 10)
pattern = '\\d\\.\\d+'
s = 'I study python 3.11 every day'  # 待匹配字符串
matchVal = re.match(pattern, s, re.I)
print(matchVal)
s1 = '3.11Python I study every day'
matchVal1 = re.match(pattern, s1, re.I)  # <re.Match object; span=(0, 4), match='3.11'>
print(matchVal1)
print('匹配值的起始位置', matchVal1.start())
print('匹配值的结束位置', matchVal1.end())
print('匹配值的区间位置元素', matchVal1.span())
print('代匹配的字符串', matchVal1.string)
print('匹配的数据', matchVal1.group())
# ----------------------re.search-----------------------
print('*' * 10, 're.search', '*' * 10)
s2 = 'I study Python 3.12 every day Python 2.7 love you'
s3 = 'I study Python every day Python love you'
searchVal2 = re.search(pattern, s2, re.I)
searchVal3 = re.search(pattern, s3, re.I)
print(searchVal2)
print(searchVal3)
print('匹配值的起始位置', searchVal2.start())
print('匹配值的结束位置', searchVal2.end())
print('匹配值的区间位置元素', searchVal2.span())
print('代匹配的字符串', searchVal2.string)
print('匹配的数据', searchVal2.group())
# ----------------------re.find-----------------------
print('*' * 10, 're.findall', '*' * 10)
findalls2 = re.findall(pattern, s2)
print(findalls2)
# ----------------------re.split-----------------------
print('*' * 10, 're.sub', '*' * 10)
patternStr = '黑客|破解|反爬'
sText = '我想学习Python，想破解一些VIP视频。Python可以实现无底线反弹嘛？'
new_sText = re.sub(patternStr, 'xxx', sText)
print(new_sText)

# ----------------------re.split-----------------------
print('*' * 10, 're.findall', '*' * 10)
patternSplit = '[?|&]'
locaText = 'http://python.p2hp.com?downloads/#google…'
new_locaText_split = re.split(patternSplit, locaText)
print(new_locaText_split)
